package net.zoneland.knowledge.service;

import java.util.List;

import net.zoneland.knowledge.model.LoginUserPojo;
import net.zoneland.knowledge.model.WorkApplyInfo;
import net.zoneland.knowledge.model.WorkSubTaskInfo;
import net.zoneland.uniflow.client.UserInfo;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;

/**
 * 任务分派-分任务服务接口。
 */
public interface WorkSubTaskHandleService {

    /**
     * 分派分任务.
     * <p>这个方法是针对部分分任务的分派，不是整个工单一起分派</p>
     * @param currentApplyInfo 当前工单信息
     * @param subTasks 要下发的分任务列表，可能只是当前工单下的部分分任务
     * @param dispatchUserNames 要分派的人员名单（要分配给这些人），此字段由选人框产生
     * @param opinion 处理意见
     * @param user 处理人
     */
    void dispatch(WorkApplyInfo currentApplyInfo, List<WorkSubTaskInfo> subTasks, final String dispatchUserNames, String opinion, LoginUserPojo user);

    /**
     * 上报分任务.
     * @param currentApplyInfo 当前工单
     * @param subTasks 要上报的分任务列表，可能只是当前工单下的部分分任务
     * @param taskId 当前任务实例的id
     * @param opinion 处理意见
     * @param user 处理人
     * @param request
     * @return 三元组，依次为：当前工单，已经上报了的分任务列表，父工单
     */
    Triple<WorkApplyInfo, List<WorkSubTaskInfo>, WorkApplyInfo> report(WorkApplyInfo currentApplyInfo, List<WorkSubTaskInfo> subTasks, final String taskId, String opinion, LoginUserPojo user, HttpServletRequest request);

    /**
     * 退回分任务.
     * @param currentApplyInfo 当前工单
     * @param subTasks 要退回的分任务列表。注意，这个要退回的分任务是属于子工单的、不是属于当前工单的
     * @param opinion 处理意见
     * @param user 处理人
     * @return 已经被退回的分任务列表
     */
    List<WorkSubTaskInfo> reject(WorkApplyInfo currentApplyInfo, List<WorkSubTaskInfo> subTasks, String opinion, LoginUserPojo user);

    /**
     * 确认分任务.
     * @param currentApplyInfo 当前工单
     * @param subTasks 要确认的分任务列表。注意，这个要确认的分任务是属于子工单的、不是属于当前工单的
     * @param opinion 处理意见
     * @param user 处理人
     * @return 二元组，依次为：已经确认的分任务列表，收到影响的父级分任务列表
     */
    Pair<List<WorkSubTaskInfo>, List<WorkSubTaskInfo>> confirm(WorkApplyInfo currentApplyInfo, List<WorkSubTaskInfo> subTasks, String opinion, LoginUserPojo user);

}

